package com.sky.controller.admin;


import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/admin/dish")
public class DishController {

    @Autowired
    private DishService dishService;

    /**
     * 新增菜品
     *
     * @param dishDTO
     * @return
     */

    @PostMapping
    @CacheEvict(cacheNames = "dishes_categoryId",key = "#dishDTO.categoryId")
    public Result insertDish(@RequestBody DishDTO dishDTO) {
        log.info("添加菜品，参数为：{}", dishDTO);
        dishService.insertDishAndFlavor(dishDTO);
        return Result.success();
    }


    /**
     * 菜品的条件分页查询
     *
     * @param dishPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    public Result<PageResult> pageQuery(DishPageQueryDTO dishPageQueryDTO) {
        log.info("菜品分页查询，参数为{}", dishPageQueryDTO);
        PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);
        return Result.success(pageResult);
    }

    /**
     * 菜品的批量删除
     *
     * @param ids
     * @return 接收集合参数时需加上@RequestParam注解
     */
    @CacheEvict(cacheNames = "dishes_categoryId",allEntries = true)
    @DeleteMapping
    public Result DeleteDish(@RequestParam List<Long> ids) {
        log.info("菜品的批量删除，参数为{}", ids);
        dishService.deleteDish(ids);
        return Result.success();
    }

    /**
     * 修改菜品时的数据回显，即根据id查询菜品
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result<DishVO> findDishById(@PathVariable Long id) {
        log.info("修改菜品时的数据回显，即根据id查询菜品，参数为：{}", id);
        DishVO dishVO = dishService.findDishById(id);
        return Result.success(dishVO);
    }

    /**
     * 修改菜品的相关信息，包括口味
     *
     * @param dishDTO
     * @return
     */
    //修改菜品可能会修改分类，所以需要清理所有的缓存
    @CacheEvict(cacheNames = "dishes_categoryId",allEntries = true)
    @PutMapping
    public Result updateDish(@RequestBody DishDTO dishDTO) {
        log.info("修改菜品，参数为{}", dishDTO);
        dishService.updateDish(dishDTO);
        return Result.success();
    }

//    /**
//     * 根据分类id查询菜品
//     *
//     * @param categoryId
//     * @return
//     */
//    @GetMapping("/list")
//    public Result selectDishByCategoryId(@RequestParam("categoryId") Long categoryId) {
//        log.info("根据分类id查询菜品，参数categoryId = {}", categoryId);
//        List<Dish> dishList = dishService.selectDishByCategoryId(categoryId);
//        return Result.success(dishList);
//    }


    /**
     * 根据name和分类id查询菜品(
     * 都是在更新或者新增套餐的时候添加套餐所属的菜品的时候使用，
     * 前者是搜索框用，后者是点击左边的菜单的时候用)
     *
     * @param categoryId
     * @param name
     * @return
     */
    /*当两个请求路径相同时，可以使用不同的请求参数来区分它们required = false以表示是否需要这个参数*/
    @GetMapping("/list")
    public Result selectDishByNameOrCategoryId(@RequestParam(value = "categoryId", required = false) Long categoryId,
                                   @RequestParam(value = "name", required = false) String name) {
        log.info("根据分类id或者name查询菜品，name = {}, categoryId = {}", name,categoryId);
        List<DishVO> dishList = dishService.selectDishByNameAndCategoryId(name,categoryId);
        log.info("根据分类id或者name查询菜品,回传的数据为：{}",dishList);
        return Result.success(dishList);
    }

    /**
     * 菜品起售、停售
     *
     * @param status
     * @param id
     * @return
     */
    //菜品的起售停售，没有分类的id，没法定点清理，所以也清理所有的缓存
    @CacheEvict(cacheNames = "dishes_categoryId",allEntries = true)
    @PostMapping("/status/{status}")
    public Result updateDishStatus(@PathVariable Integer status, @RequestParam("id") Long id) {
        dishService.updateDishStatus(status, id);
        log.info("菜品的起售、停售，参数为:{},{}", status, id);
        return Result.success();
    }

//    @GetMapping("/list")
//    public Result selectDishByName(@RequestParam("name") String name){
//    log.info("根据名字查询菜品，名字为：{}",name);
//        return Result.success();
//    }

}
